#include "playscene.h"
#include <QLabel>
#include "mycoin.h"
#include <QSound>

//PlayScene::PlayScene(QWidget *parent) : QMainWindow(parent)
//{
//}

PlayScene::PlayScene(int index)
{
    //qDebug() << "当前关卡为"<< index;
    this->levalIndex = index;
    //设置窗口固定大小
    this->setFixedSize(320,588);
    //设置图标
    this->setWindowIcon(QPixmap(":/res/Coin0001.png"));
    //设置标题

    QString str1("翻金币");
    QString str2 = QString::number(this->levalIndex);
    str1.append(str2);
    this->setWindowTitle(str1);

    //创建菜单栏
    QMenuBar * bar = this->menuBar();
    this->setMenuBar(bar);
    //创建开始菜单
    QMenu * startMenu = bar->addMenu("开始");
    //创建按钮菜单项
    QAction * quitAction = startMenu->addAction("退出");

    //返回按钮音效
    QSound *backSound = new QSound(":/res/BackButtonSound.wav",this);
    //翻金币音效
    QSound *flipSound = new QSound(":/res/ConFlipSound.wav",this);
    //胜利按钮音效
    QSound *winSound = new QSound(":/res/LevelWinSound.wav",this);

    //点击退出 退出游戏
    connect(quitAction,&QAction::triggered,[=](){this->close();});

    //返回按钮
    MyPushButton * closeBtn = new MyPushButton(":/res/BackButton.png",":/res/BackButtonSelected.png");
    closeBtn->setParent(this);
    closeBtn->move(this->width()-closeBtn->width()-5,this->height()-closeBtn->height()-11);

    //返回按钮功能实现
    connect(closeBtn,&MyPushButton::clicked,[=](){
        backSound->play();
        QTimer::singleShot(500, this,[=](){
            this->hide();
            //触发自定义信号，关闭自身，该信号写到 signals下做声明
            emit this->chooseSceneBack();
        });
    });

    //当前关卡标题
    QLabel * label = new QLabel;
    label->setParent(this);
    QFont font;
    font.setFamily("华文新魏");
    font.setPointSize(20);
    label->setFont(font);
    QString str = QString("Leavel: %1").arg(this->levalIndex);
    label->setText(str);
    label->setGeometry(QRect(30, this->height() - 50,150, 50)); //设置大小和位置

    //创建金币的背景图片
      for(int i = 0 ; i < 4;i++)
      {
          for(int j = 0 ; j < 4; j++)
          {
             //绘制背景图片
              QLabel* label = new QLabel;
              label->setGeometry(0,0,50,50);
              label->setPixmap(QPixmap(":/res/BoardNode.png"));
              label->setParent(this);
              label->move(57 + i*50,200+j*50);

              //金币对象
              MyCoin * coin = new MyCoin(":/res/Coin0001.png");
              coin->setParent(this);
              coin->move(59 + i*50,204+j*50);
          }
      }

    //将胜利的图片提前创建好，如果胜利触发了，将图片弹下来即可
    QLabel* winLabel = new QLabel;
    QPixmap tmpPix;
    tmpPix.load(":/res/LevelCompletedDialogBg.png");
    winLabel->setGeometry(0,0,tmpPix.width(),tmpPix.height());
    winLabel->setPixmap(tmpPix);
    winLabel->setParent(this);
    winLabel->move( (this->width() - tmpPix.width())*0.5 , -tmpPix.height());


      //初始化每个关卡的二维数组
      dataConfig config;
      for(int i = 0 ; i < 4;i++)
      {
          for(int j = 0 ; j < 4; j++)
          {
              this->gameArray[i][j] = config.mData[this->levalIndex][i][j];

              //金币对象
              QString img;
              if(this->gameArray[i][j] == 1)
              {
                img = ":/res/Coin0001.png";
              }
              else
              {
                img = ":/res/Coin0008.png";
              }

              MyCoin * coin = new MyCoin(img);
              coin->setParent(this);
              coin->move(59 + i*50,204+j*50);
              coin->posX = i; //记录x坐标
              coin->posY = j; //记录y坐标
              coin->flag =this->gameArray[i][j]; //记录正反标志

              coinBtn[i][j] = coin;
              //监听每个按钮的点击效果，并翻转金币
              connect(coin,&MyCoin::clicked,[=](){
                  //qDebug() << "点击的位置： x = " <<  coin->posX << " y = " << coin->posY ;
                  //翻金币音效
                  flipSound->play();
                  //改变标志,执行翻转效果
                  coin->changeFlag();
                  this->gameArray[i][j] = this->gameArray[i][j] == 0 ? 1 : 0; //数组内部记录的标志同步修改

                  //延时翻动其他周围金币
                  QTimer::singleShot(300, this,[=](){
                                      if(coin->posX+1 <=3)
                                      {
                                        coinBtn[coin->posX+1][coin->posY]->changeFlag();
                                        this->gameArray[coin->posX+1][coin->posY] = this->gameArray[coin->posX+1][coin->posY]== 0 ? 1 : 0;
                                      }
                                      if(coin->posX-1>=0)
                                      {
                                        coinBtn[coin->posX-1][coin->posY]->changeFlag();
                                        this->gameArray[coin->posX-1][coin->posY] = this->gameArray[coin->posX-1][coin->posY]== 0 ? 1 : 0;
                                      }
                                      if(coin->posY+1<=3)
                                      {
                                       coinBtn[coin->posX][coin->posY+1]->changeFlag();
                                       this->gameArray[coin->posX][coin->posY+1] = this->gameArray[coin->posX+1][coin->posY]== 0 ? 1 : 0;
                                      }
                                      if(coin->posY-1>=0)
                                      {
                                       coinBtn[coin->posX][coin->posY-1]->changeFlag();
                                       this->gameArray[coin->posX][coin->posY-1] = this->gameArray[coin->posX+1][coin->posY]== 0 ? 1 : 0;
                                      }


                                      //判断是否胜利
                                      this->isWin = true;
                                      for(int i = 0 ; i < 4;i++)
                                      {
                                          for(int j = 0 ; j < 4; j++)
                                          {
                                              //qDebug() << coinBtn[i][j]->flag ;
                                              if( coinBtn[i][j]->flag == false)
                                              {
                                                  this->isWin = false;
                                                  break;
                                              }
                                          }
                                      }

                                      if(this->isWin==true){
                                          //胜利了
                                          qDebug()<<"游戏胜利";
                                          winSound->play();
                                          //将胜利的图片弹下来即可
                                          QPropertyAnimation * animation1 =  new QPropertyAnimation(winLabel,"geometry");
                                          animation1->setDuration(1000);
                                          animation1->setStartValue(QRect(winLabel->x(),winLabel->y(),winLabel->width(),winLabel->height()));
                                          animation1->setEndValue(QRect(winLabel->x(),winLabel->y()+114,winLabel->width(),winLabel->height()));
                                          animation1->setEasingCurve(QEasingCurve::OutBounce);
                                          animation1->start();
                                      }

                                      if(this->isWin==true){
                                          //禁用所有按钮点击事件
                                              for(int i = 0 ; i < 4;i++)
                                                {
                                                  for(int j = 0 ; j < 4; j++)
                                                  {
                                                    coinBtn[i][j]->isWin = true;
                                                  }
                                          }
                                      }
                                  });
              });
          }
      }




}

void PlayScene::paintEvent(QPaintEvent *)
{
    //加载背景
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/res/PlayLevelSceneBg.png");
    painter.drawPixmap(0,0,this->width(),this->height(),pix);

    //加载标题
    pix.load(":/res/Title.png");
    pix = pix.scaled(pix.width()*0.5,pix.height()*0.5);
    painter.drawPixmap(10,30,pix.width(),pix.height(),pix);

}
